home *** CD-ROM | disk | FTP | other *** search
/ Primal 3D Interactive Se…es (Professional Edition) / Interactive Spine CD / SPINE.bin / shared / dbutils.lua < prev    next >
Text File  |  2001-09-18  |  23KB  |  475 lines

  1. -- dbutils.lua
  2. -- for Spine
  3.  
  4. resMap = {}
  5.  
  6. resMap["483"] = {c = "helptext"}
  7. resMap["513"] = {c = "labeltextanat"}
  8. resMap["514"] = {c = "labeltextpath"}
  9.  
  10. resMap["3320"] = {c = "surfmovies"}
  11. resMap["3874"] = {c = "illustrations"}
  12. resMap["3881"] = {c = "clinslides"}
  13. resMap["3882"] = {c = "illustrations"}
  14. resMap["3883"] = {c = "dissslides"}
  15. resMap["3886"] = {c = "vhslides"}
  16.  
  17. resMap["388700"] = {c = "mraxial0", s = "38870001", cs = "getMrModelLink('aa000','lvl',%s)"}
  18. resMap["388701"] = {c = "mraxial1", s = "38870101", cs = "getMrModelLink('ba000','lvl',%s)"}
  19. resMap["388702"] = {c = "mraxial2", s = "38870201", cs = "getMrModelLink('ca000','lvl',%s)"}
  20. resMap["388710"] = {c = "mrsagittal0", s = "38871001", cs = "getMrModelLink('da000','lvl',%s)"}
  21. resMap["388711"] = {c = "mrsagittal1", s = "38871101", cs = "getMrModelLink('ea000','lvl',%s)"}
  22. resMap["388712"] = {c = "mrsagittal2", s = "38871201", cs = "getMrModelLink('fa000','lvl',%s)"}
  23. resMap["388720"] = {c = "mrcoronal0", s = "38872001", cs = "getMrModelLink('ga000','lvl',%s)"}
  24. resMap["388721"] = {c = "mrcoronal1", s = "38872101", cs = "getMrModelLink('ha000','lvl',%s)"}
  25. resMap["388722"] = {c = "mrcoronal2", s = "38872201", cs = "getMrModelLink('ia000','lvl',%s)"}
  26.  
  27. resMap["a"] = {c = "csaxial0", s = "aa000", t = "getSliceModelTitle('Axial Cervical Model', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", mr = "getModelMrLink(38870001,%s)", th = "model.png"}
  28. resMap["b"] = {c = "csaxial1", s = "ba000", t = "getSliceModelTitle('Axial Thoracic Model', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", mr = "getModelMrLink(38870101,%s)", th = "model.png"}
  29. resMap["c"] = {c = "csaxial2", s = "ca000", t = "getSliceModelTitle('Axial Lumbar Model', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", mr = "getModelMrLink(38870201,%s)", th = "model.png"}
  30. resMap["d"] = {c = "cssagittal0", s = "da000", t = "getSliceModelTitle('Sagittal Cervical Model', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", mr = "getModelMrLink(38871001,%s)", th = "model.png"}
  31. resMap["e"] = {c = "cssagittal1", s = "ea000", t = "getSliceModelTitle('Sagittal Thoracic Model', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", mr = "getModelMrLink(38871101,%s)", th = "model.png"}
  32. resMap["f"] = {c = "cssagittal2", s = "fa000", t = "getSliceModelTitle('Sagittal Lumbar Model', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", mr = "getModelMrLink(38871201,%s)", th = "model.png"}
  33. resMap["g"] = {c = "cscoronal0", s = "ga000", t = "getSliceModelTitle('Coronal Cervical Model', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", mr = "getModelMrLink(38872001,%s)", th = "model.png"}
  34. resMap["h"] = {c = "cscoronal1", s = "ha000", t = "getSliceModelTitle('Coronal Thoracic Model', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", mr = "getModelMrLink(38872101,%s)", th = "model.png"}
  35. resMap["i"] = {c = "cscoronal2", s = "ia000", t = "getSliceModelTitle('Coronal Lumbar Model', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", mr = "getModelMrLink(38872201,%s)", th = "model.png"}
  36.  
  37. resMap["q"] = {c = "model0", s = "qa000", t = "getModelTitle('Vertebral Column', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  38. resMap["r"] = {c = "model1", s = "ra000", t = "getModelTitle('Cervical Vertebral Spine', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  39. resMap["t"] = {c = "model3", s = "ta000", t = "getModelTitle('Thoracic Vertebral Spine', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  40. resMap["v"] = {c = "model5", s = "va000", t = "getModelTitle('Lumbar Vertebral Spine', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  41. resMap["x"] = {c = "model7", s = "xa000", t = "getModelTitle('Sacral Region', %s)", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  42.  
  43. resMap["za"] = {c = "modelx0", s = "za000", t = "'Occipital Bone'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  44. resMap["zb"] = {c = "modelx1", s = "zb000", t = "'C4 Vertebra'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  45. resMap["zc"] = {c = "modelx2", s = "zc000", t = "'T6 Vertebra'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  46. resMap["zd"] = {c = "modelx3", s = "zd000", t = "'L2 Vertebra'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  47. resMap["ze"] = {c = "modelx4", s = "ze000", t = "'Ligament Flava'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  48. resMap["zf"] = {c = "modelx5", s = "zf000", t = "'Posterior Longitudinal Lig.'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  49. resMap["zg"] = {c = "modelx6", s = "zg000", t = "'Atlanto-Occipital Joint'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  50. resMap["zh"] = {c = "modelx7", s = "zh000", t = "'Cranio-Vertebral Junction'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  51. resMap["zi"] = {c = "modelx8", s = "zi000", t = "'Typical Sacrum'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  52. resMap["zj"] = {c = "modelx9", s = "zj000", t = "'Intervertebral Foramina'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  53. resMap["zk"] = {c = "modelx10", s = "zk000", t = "'Spinal Cord (Cervical Region)'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  54. resMap["zl"] = {c = "modelx11", s = "zl000", t = "'Basivertebral Veins (Lumbar)'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  55. resMap["zm"] = {c = "modelx12", s = "zm000", t = "'Neck Muscles'", i = "getModelImage(%s)", o = "getModelOverlay(%s)", th = "model.png"}
  56.  
  57. -----------------------------------
  58.  
  59. seqGetModelIndexPos = function (resId)
  60.   local g, l, num = splitModelResId(resId)
  61.   return tonumber(num)
  62. end
  63.  
  64. seqMakeResModelIndex = function (resId, pos)
  65.   local group, subGrp, i = splitModelResId(resId)
  66.   return makeModelResId(group, subGrp, pos)
  67. end
  68.  
  69. seqGetModelSubGrpPos = function (resId)
  70.   local g, subGrp, n = splitModelResId(resId)
  71.   return strbyte(subGrp) - strbyte('a')
  72. end
  73.  
  74. seqMakeResModelSubGrp = function (resId, pos)
  75.   local group, s, idx = splitModelResId(resId)
  76.   return makeModelResId(group, strchar(strbyte('a') + pos), idx)
  77. end
  78.  
  79. seqGetSlicePos = function (resId, base, step)
  80.   if not step then step = 10 end
  81.   return (resId - base) / step
  82. end
  83.  
  84. seqMakeResSlice = function (resId, pos, base, step)
  85.   if not step then step = 10 end
  86.   return pos * step + base
  87. end
  88.  
  89. seqGetViewPos = function (resId, viewTbl)
  90.  
  91.   local checkTable = function (idx, val)
  92.     if strfind(%resId, val, 1, 1) == 1 then
  93.       return idx - 1
  94.     else
  95.       return nil
  96.     end
  97.   end
  98.   
  99.   local pos = foreach(viewTbl, checkTable)
  100.   
  101.   if not pos then
  102.     return nil
  103.   else
  104.     return pos
  105.   end
  106.   
  107. end
  108.  
  109. seqMakeResView = function (resId, pos, viewTbl)
  110.   return getStartLink(viewTbl[pos+1])
  111. end
  112.  
  113. seqGetPrfxPos = function (resId, prfxTbl)
  114.  
  115.   local checkTable = function (idx, val)
  116.     if strfind(%resId, val, 1, 1) == 1 then
  117.       return idx - 1
  118.     else
  119.       return nil
  120.     end
  121.   end
  122.   
  123.   local pos = foreach(prfxTbl, checkTable)
  124.   
  125.   if not pos then
  126.     return nil
  127.   else
  128.     return pos
  129.   end
  130.   
  131. end
  132.  
  133. seqMakePrfx = function (resId, pos, prfxTbl)
  134.   return prfxTbl[pos+1]..strsub(resId, strlen(prfxTbl[pos+1])+1)
  135. end
  136.  
  137. -- Product specific funcs
  138.  
  139. vhpGetSlicePos = function (resId)
  140.   local pos = seqGetSlicePos(resId, 38860037,4)
  141.     if pos >= 23 then pos = pos - 1 end 
  142.   return pos
  143. end
  144.  
  145. vhpMakeResSlice = function (resId,pos)
  146.   local newpos = pos  
  147.   if newpos >= 22 then newpos = newpos + 1 end 
  148.   return seqMakeResSlice(resId,newpos,38860037,4)
  149. end
  150.  
  151. --
  152.  
  153. mainViewSeq = {"q","r","t","v","x","za","zb","zc","zd","zi","ze","zf","zg","zh","zj","zk","zl","zm"}
  154. radViewSeq = {"a", "b", "c", "d", "e", "f", "g", "h", "i", "q"}
  155. mrViewSeq = {"388700", "388701", "388702", "388710", "388711", "388712", "388720", "388721", "388722"}
  156. mrViewTitles = {"Axial Cervical", "Axial Thoracic", "Axial Lumbar", "Sagittal Cervical", "Sagittal Thoracic", "Sagittal Lumbar", "Coronal Cervical", "Coronal Thoracic", "Coronal Lumbar"}
  157. textTypeSeq = {"513", "514"}
  158. layerTitles = {"Layer 1", "Layer 2", "Layer 3", "Layer 4", "Layer 5", "Layer 6", "Layer 7", "Layer 8", "Layer 9", "Layer 10", "Layer 11", "Layer 12", "Layer 13", "Layer 14", "Layer 15", "Surface anatomy", "Cutaneous distribution", "Dermatome distribution", "Arteries in overview", "Veins in overview", "Nerves in overview", "Neurovascular structures"}
  159.  
  160. seqTable = {
  161.  
  162.   {name = "texttype", inFunc = "seqGetPrfxPos(%s, textTypeSeq)", posFunc = function (resId) return seqGetPrfxPos(resId, textTypeSeq) end, makeFunc = function (resId,pos) return seqMakePrfx(resId,pos,textTypeSeq) end, len = getn(textTypeSeq)},
  163.  
  164.   {name = "mainview", inFunc = "seqGetViewPos(%s, mainViewSeq)", posFunc = function (resId) return seqGetViewPos(resId, mainViewSeq) end, makeFunc = function (resId,pos) return seqMakeResView(resId,pos,mainViewSeq) end, len = getn(mainViewSeq)},
  165.   {name = "radview", inFunc = "seqGetViewPos(%s, radViewSeq)", posFunc = function (resId) return seqGetViewPos(resId, radViewSeq) end, makeFunc = function (resId,pos) return seqMakeResView(resId,pos,radViewSeq) end, len = getn(radViewSeq)},
  166.   {name = "mrview", inFunc = "seqGetPrfxPos(%s, mrViewSeq)", posFunc = function (resId) return seqGetPrfxPos(resId, mrViewSeq) end, makeFunc = function (resId,pos) return seqMakePrfx(resId,pos,mrViewSeq) end, len = getn(mrViewSeq), pttl = mrViewTitles},
  167.  
  168.   {name = "main", inFunc = "beginsWith(%s, '38860')", posFunc = vhpGetSlicePos, makeFunc = vhpMakeResSlice, loop = 1, len = 43},
  169.  
  170.   {name = "main", inFunc = "beginsWith(%s, '388700')", posFunc = function (resId) return seqGetSlicePos(resId,38870001,1) end, makeFunc =  function (resId,pos) return seqMakeResSlice(resId,pos,38870001,1) end, len = 27},
  171.   {name = "main", inFunc = "beginsWith(%s, '388701')", posFunc = function (resId) return seqGetSlicePos(resId,38870101,1) end, makeFunc =  function (resId,pos) return seqMakeResSlice(resId,pos,38870101,1) end, len = 9},
  172.   {name = "main", inFunc = "beginsWith(%s, '388702')", posFunc = function (resId) return seqGetSlicePos(resId,38870201,1) end, makeFunc =  function (resId,pos) return seqMakeResSlice(resId,pos,38870201,1) end, len = 15},
  173.   {name = "main", inFunc = "beginsWith(%s, '388710')", posFunc = function (resId) return seqGetSlicePos(resId,38871001,1) end, makeFunc =  function (resId,pos) return seqMakeResSlice(resId,pos,38871001,1) end, len = 11},
  174.   {name = "main", inFunc = "beginsWith(%s, '388711')", posFunc = function (resId) return seqGetSlicePos(resId,38871101,1) end, makeFunc =  function (resId,pos) return seqMakeResSlice(resId,pos,38871101,1) end, len = 11},
  175.   {name = "main", inFunc = "beginsWith(%s, '388712')", posFunc = function (resId) return seqGetSlicePos(resId,38871201,1) end, makeFunc =  function (resId,pos) return seqMakeResSlice(resId,pos,38871201,1) end, len = 11},
  176.   {name = "main", inFunc = "beginsWith(%s, '388720')", posFunc = function (resId) return seqGetSlicePos(resId,38872001,1) end, makeFunc =  function (resId,pos) return seqMakeResSlice(resId,pos,38872001,1) end, len = 5},
  177.   {name = "main", inFunc = "beginsWith(%s, '388721')", posFunc = function (resId) return seqGetSlicePos(resId,38872101,1) end, makeFunc =  function (resId,pos) return seqMakeResSlice(resId,pos,38872101,1) end, len = 5},
  178.   {name = "main", inFunc = "beginsWith(%s, '388722')", posFunc = function (resId) return seqGetSlicePos(resId,38872201,1) end, makeFunc =  function (resId,pos) return seqMakeResSlice(resId,pos,38872201,1) end, len = 5},
  179.  
  180.   {name = "main", inFunc = "beginsWith(%s, 'a')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 7, rev = 1},
  181.   {name = "lvl", inFunc = "beginsWith(%s, 'a')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 27},
  182.   {name = "main", inFunc = "beginsWith(%s, 'b')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 7, rev = 1},
  183.   {name = "lvl", inFunc = "beginsWith(%s, 'b')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 9},
  184.   {name = "main", inFunc = "beginsWith(%s, 'c')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 7, rev = 1},
  185.   {name = "lvl", inFunc = "beginsWith(%s, 'c')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 15},
  186.   {name = "main", inFunc = "beginsWith(%s, 'd')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 7, rev = 1},
  187.   {name = "lvl", inFunc = "beginsWith(%s, 'd')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 11},
  188.   {name = "main", inFunc = "beginsWith(%s, 'e')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 7, rev = 1},
  189.   {name = "lvl", inFunc = "beginsWith(%s, 'e')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 11},
  190.   {name = "main", inFunc = "beginsWith(%s, 'f')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 7, rev = 1},
  191.   {name = "lvl", inFunc = "beginsWith(%s, 'f')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 11},
  192.   {name = "main", inFunc = "beginsWith(%s, 'g')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 7, rev = 1},
  193.   {name = "lvl", inFunc = "beginsWith(%s, 'g')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 5},
  194.   {name = "main", inFunc = "beginsWith(%s, 'h')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 7, rev = 1},
  195.   {name = "lvl", inFunc = "beginsWith(%s, 'h')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 5},
  196.   {name = "main", inFunc = "beginsWith(%s, 'i')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 7, rev = 1},
  197.   {name = "lvl", inFunc = "beginsWith(%s, 'i')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 5},
  198.  
  199.   {name = "main", inFunc = "beginsWith(%s, 'za')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 34, loop = 1},
  200.   {name = "main", inFunc = "beginsWith(%s, 'zb')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 34, loop = 1},
  201.   {name = "main", inFunc = "beginsWith(%s, 'zc')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 34, loop = 1},
  202.   {name = "main", inFunc = "beginsWith(%s, 'zd')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 34, loop = 1},
  203.   {name = "main", inFunc = "beginsWith(%s, 'ze')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 10},
  204.   {name = "main", inFunc = "beginsWith(%s, 'zf')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 36, loop = 1, rev = 1},
  205.   {name = "main", inFunc = "beginsWith(%s, 'zg')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 34, loop = 1, rev = 1},
  206.   {name = "main", inFunc = "beginsWith(%s, 'zh')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 7},
  207.   {name = "main", inFunc = "beginsWith(%s, 'zi')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 15, loop = 1, rev = 1},
  208.   {name = "main", inFunc = "beginsWith(%s, 'zj')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 36, loop = 1, rev = 1},
  209.   {name = "main", inFunc = "beginsWith(%s, 'zk')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 36, loop = 1, rev = 1},
  210.   {name = "main", inFunc = "beginsWith(%s, 'zl')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 36, loop = 1, rev = 1},
  211.   {name = "main", inFunc = "beginsWith(%s, 'zm')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 7},
  212.   
  213.   {name = "main", inFunc = "beginsWith(%s, 'q')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 36, loop = 1, rev = 1},
  214.   {name = "lvl", inFunc = "beginsWith(%s, 'q')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 22, pttl = layerTitles, sfclPos = 15},
  215.   {name = "main", inFunc = "beginsWith(%s, 'r')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 36, loop = 1, rev = 1},
  216.   {name = "lvl", inFunc = "beginsWith(%s, 'r')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 22, pttl = layerTitles, sfclPos = 15},
  217.   {name = "main", inFunc = "beginsWith(%s, 't')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 36, loop = 1, rev = 1},
  218.   {name = "lvl", inFunc = "beginsWith(%s, 't')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 22, pttl = layerTitles, sfclPos = 15},
  219.   {name = "main", inFunc = "beginsWith(%s, 'v')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 36, loop = 1, rev = 1},
  220.   {name = "lvl", inFunc = "beginsWith(%s, 'v')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 22, pttl = layerTitles, sfclPos = 15},
  221.   {name = "main", inFunc = "beginsWith(%s, 'x')", posFunc = seqGetModelIndexPos, makeFunc = seqMakeResModelIndex, len = 36, loop = 1, rev = 1},
  222.   {name = "lvl", inFunc = "beginsWith(%s, 'x')", posFunc = seqGetModelSubGrpPos, makeFunc = seqMakeResModelSubGrp, len = 22, pttl = layerTitles, sfclPos = 15}
  223.  
  224. }
  225.  
  226. -----------------------------------
  227.  
  228. getSeqAttrib = function (resId, seqName, op, arg1)
  229.  
  230.   local checkMatch = function (idx, seqInfo)
  231.     if seqInfo.name ~= %seqName then
  232.       return nil
  233.     end
  234.     if not dostring(format("return "..seqInfo.inFunc, "'"..%resId.."'")) then
  235.       return nil
  236.     end
  237.     return seqInfo
  238.   end
  239.   
  240.   local seqInfo = foreachi(seqTable, checkMatch)
  241.   
  242.   if not seqInfo then return nil end
  243.   
  244.   if op == 'atrb' then return seqInfo[arg1] end
  245.  
  246.   local pos = call(seqInfo.posFunc, {resId})
  247.   if seqInfo.rev then
  248.     pos = seqInfo.len - 1 - pos
  249.   end
  250.   
  251.   if op == 'pos' then return pos end
  252.   
  253.   if op == 'pttl' then
  254.     if not seqInfo.pttl then return "" end
  255.     return seqInfo.pttl[pos+1]  
  256.   end
  257.   
  258.   local newPos = pos
  259.   if op == 'next' then
  260.     newPos = pos + 1
  261.   elseif op == 'prev' then
  262.     newPos = pos - 1
  263.   elseif op == 'at' then
  264.     newPos = arg1
  265.   else
  266.     return nil
  267.   end
  268.  
  269.   if newPos < 0 then
  270.     if seqInfo.loop then 
  271.       newPos = seqInfo.len - 1
  272.     else
  273.       newPos = -1
  274.     end
  275.   elseif newPos >= seqInfo.len then
  276.     if seqInfo.loop then 
  277.       newPos = 0
  278.     else
  279.       newPos = -1
  280.     end
  281.   end
  282.  
  283.   if newPos == -1 then
  284.     return ""
  285.   end
  286.  
  287.   if seqInfo.rev then
  288.     newPos = seqInfo.len - 1 - newPos
  289.   end
  290.   return call(seqInfo.makeFunc, {resId, newPos})
  291.   
  292. end
  293.  
  294. beginsWith = function (str, start)
  295.   return (strfind(str, start, 1, 1) == 1)
  296. end
  297.  
  298. inRange = function (val, min, max)
  299.   val = tonumber(val)
  300.   if not val then return nil end
  301.   return ((val >= min) and (val <= max))
  302. end
  303.  
  304. findResAttrib = function (resId, attribId)
  305.  
  306.   local checkMatch = function (pattern, attribs)
  307.     if beginsWith(%resId, pattern) then
  308.       return attribs[%attribId]
  309.     end
  310.     return nil
  311.   end
  312.   
  313.   result = foreach(resMap, checkMatch)
  314.   
  315.   if not result then
  316.     result = ""
  317.   end
  318.   
  319.   return result
  320.  
  321. end
  322.  
  323.  
  324. splitModelResId = function (resId)
  325.   -- return group, layer, number
  326.   return strsub(resId, 1, 1), strsub(resId, 2, 2), strsub(resId, 3)
  327. end
  328.  
  329. makeModelResId = function (group, layer, number)
  330.   return group..layer..format('%03d', number)
  331. end
  332.  
  333.  
  334. getModelImage = function (resId)
  335.   local group, layer, number = splitModelResId(resId)
  336.   return group.."\\"..layer.."\\s"..group..layer..number..".jpg"
  337. end
  338.  
  339.  
  340. getModelOverlay = function (resId)
  341.   local group, layer, number = splitModelResId(resId)
  342.   return group.."\\"..layer.."\\r"..group..layer..number..".png"
  343. end
  344.  
  345.  
  346. getModelTitle = function (groupTitle, resId)
  347.  
  348.   local layer = strbyte(resId, 2) - strbyte("a") + 1
  349.   
  350.   if layer >= 1 then
  351.     return groupTitle.." (Layer "..layer..")"
  352.   else 
  353.     return groupTitle
  354.   end
  355.  
  356. end
  357.  
  358. getSliceModelTitle = function (groupTitle, resId)
  359.  
  360.   local slice = getSeqPos(resId, "lvl") + 1
  361.  
  362.   if slice >= 1 then
  363.     return groupTitle.." (Slice "..slice..")"
  364.   else 
  365.     return groupTitle
  366.   end
  367.  
  368. end
  369.  
  370. getModelMrLink = function (mrSeqStart, resId)
  371.  
  372.   local pos = getSeqAttrib(resId, "lvl", "pos")
  373.   
  374.   return getSeqAttrib(mrSeqStart, "main", "at", pos)
  375.  
  376. end
  377.  
  378. getMrModelLink = function (csSeqStart, csSeqName, resId)
  379.  
  380.   local pos = getSeqAttrib(resId, "main", "pos")
  381.   
  382.   return getSeqAttrib(csSeqStart, csSeqName, "at", pos)
  383.  
  384. end
  385.  
  386. doAttribScript = function (resId, attribId)
  387.  
  388.   result = ""
  389.   
  390.   script = findResAttrib(resId, attribId)
  391.   
  392.   if script ~= "" then
  393.     result = dostring(format("return "..script, "'"..resId.."'"))
  394.   end
  395.   
  396.   return result
  397.  
  398. end
  399.  
  400. -----------------------------------
  401.  
  402. getTitle = function (resId)
  403.   return doAttribScript(resId, "t")
  404. end
  405.  
  406. getThumb = function (resId)
  407.   return findResAttrib(resId, "th")
  408. end
  409.  
  410. getClass = function (resId)
  411.   return findResAttrib(resId, "c")
  412. end
  413.  
  414. getImage = function (resId)
  415.   return doAttribScript(resId, "i")
  416. end
  417.  
  418. getOverlay = function (resId)
  419.   return doAttribScript(resId, "o")
  420. end
  421.  
  422. getMrLink = function (resId)
  423.   return doAttribScript(resId, "mr")
  424. end
  425.  
  426. getCsLink = function (resId)
  427.   return doAttribScript(resId, "cs")
  428. end
  429.  
  430. getStartLink = function (resId)
  431.   return findResAttrib(resId, "s")
  432. end
  433.  
  434. getSeqLength = function (resId, seqName)
  435.   local result = getSeqAttrib(resId, seqName, "atrb", "len")
  436.   if not result then return 0 end
  437.   return result
  438. end
  439.  
  440. getSeqPos = function (resId, seqName)
  441.   local result = getSeqAttrib(resId, seqName, "pos")
  442.   if not result then return -1 end
  443.   return result
  444. end
  445.  
  446. getSeqPosTitle = function (resId, seqName)
  447.   local result = getSeqAttrib(resId, seqName, "pttl")
  448.   if not result then return "" end
  449.   return result
  450. end
  451.  
  452. getSeqValue = function (resId, seqName, pos)
  453.   local result = getSeqAttrib(resId, seqName, "at", tonumber(pos))
  454.   if not result then return "" end
  455.   return result
  456. end
  457.  
  458. getSeqNext = function (resId, seqName)
  459.   local result = getSeqAttrib(resId, seqName, "next")
  460.   if not result then return "" end
  461.   return result
  462. end
  463.  
  464. getSeqPrev = function (resId, seqName)
  465.   local result = getSeqAttrib(resId, seqName, "prev")
  466.   if not result then return "" end
  467.   return result
  468. end
  469.  
  470. getSeqAttribute = function (resId, seqName, atrbName)
  471.   local result = getSeqAttrib(resId, seqName, "atrb", atrbName)
  472.   if not result then return "" end
  473.   return result
  474. end
  475.